#include "ring_buffer.h"

// 内部结构体定义（用户不可见）
struct RingBuffer {
    uint8_t* buffer;       // 数据存储区（动态分配或用户提供）
    uint16_t size;         // 缓冲总大小（必须>=1）
    volatile uint16_t head; // 写入指针（下一个待写入位置）
    volatile uint16_t tail; // 读取指针（下一个待读取位置）
    bool is_dynamic;       // 标记是否为动态分配（用于销毁时释放内存）
};

/**
 * @brief 计算下一个指针位置（循环处理）
 */
static uint16_t ringbuf_next_pos(RingBuffer* rb, uint16_t current) {
    return (current + 1) % rb->size;
}

RingBuffer* ringbuf_create(uint16_t size) {
    if (size < 1) return NULL;

    // 分配结构体和数据缓冲区
    RingBuffer* rb = (RingBuffer*)malloc(sizeof(RingBuffer));
    if (!rb) return NULL;

    rb->buffer = (uint8_t*)malloc(size);
    if (!rb->buffer) {
        free(rb);
        return NULL;
    }

    rb->size = size;
    rb->head = 0;
    rb->tail = 0;
    rb->is_dynamic = true;
    return rb;
}

bool ringbuf_init_static(RingBuffer* rb, uint8_t* buffer, uint16_t size) {
    if (!rb || !buffer || size < 1) return false;

    rb->buffer = buffer;
    rb->size = size;
    rb->head = 0;
    rb->tail = 0;
    rb->is_dynamic = false;
    return true;
}

void ringbuf_destroy(RingBuffer* rb) {
    if (!rb) return;

    // 仅释放动态分配的缓冲区
    if (rb->is_dynamic) {
        free(rb->buffer);
    }
    free(rb); // 无论哪种方式，都释放结构体本身（静态初始化时结构体由用户管理，此处仅处理动态创建的）
}

bool ringbuf_push(RingBuffer* rb, uint8_t data) {
    if (!rb) return false;

    uint16_t next_head = ringbuf_next_pos(rb, rb->head);
    if (next_head == rb->tail) {
        return false; // 缓冲满
    }

    rb->buffer[rb->head] = data;
    rb->head = next_head;
    return true;
}

bool ringbuf_pop(RingBuffer* rb, uint8_t* data) {
    if (!rb || !data) return false;

    if (rb->head == rb->tail) {
        return false; // 缓冲空
    }

    *data = rb->buffer[rb->tail];
    rb->tail = ringbuf_next_pos(rb, rb->tail);
    return true;
}

bool ringbuf_is_empty(RingBuffer* rb) {
    return (rb && rb->head == rb->tail);
}

bool ringbuf_is_full(RingBuffer* rb) {
    if (!rb) return false;
    return (ringbuf_next_pos(rb, rb->head) == rb->tail);
}

uint16_t ringbuf_get_length(RingBuffer* rb) {
    if (!rb) return 0;

    if (rb->head >= rb->tail) {
        return rb->head - rb->tail;
    } else {
        return (rb->size - rb->tail) + rb->head;
    }
}

uint16_t ringbuf_get_capacity(RingBuffer* rb) {
    return (rb) ? rb->size : 0;
}

void ringbuf_clear(RingBuffer* rb) {
    if (rb) {
        rb->head = 0;
        rb->tail = 0;
    }
}


// 定义全局变量（仅在此处分配内存，初始化）
RingBuffer* uart0_ringbuf = NULL;  // 初始化为NULL，后续动态创建
RingBuffer* uart1_ringbuf = NULL;

// 提供初始化函数，在程序启动时调用
void ringbuf_global_init(void) {
    uart0_ringbuf = ringbuf_create(1024);  // 动态创建缓冲区（大小按需设置）
    uart1_ringbuf = ringbuf_create(1024);
    // 检查创建结果
    if (uart0_ringbuf == NULL || uart1_ringbuf == NULL) {
        // 处理初始化失败（如日志提示）
    }
}